#include "CDemData.h"
#include <cstdio>
#include <cstdlib>

CDemData::CDemData():
  iWidth(0),
  iHeight(0),
  iSize(0),
  iMin(0),
  iMax(0),
  Data(NULL),
  MatData(NULL)
{
}

CDemData::~CDemData() {
  delete[] MatData ;
  delete[] Data ;
}

int CDemData::getSize() {
  return iSize ;
}

int CDemData::getWidth() {
  return iWidth ;
}

int CDemData::getHeight() {
  return iHeight ;
}

short CDemData::getMininum() {
  return iMin ;
}

short CDemData::getMaximum() {
  return iMax ;
}

short& CDemData::operator[](int _indice) {
  return Data[_indice] ;
}

short& CDemData::refData (int _indiceWidth, int _indiceHeight) {
  return MatData[_indiceHeight][_indiceWidth] ;
}

bool CDemData::loadDem(string _Name, int _width, int _height) {
  sName = _Name ;
  if (MatData != NULL) {
    delete[] MatData ;
    MatData = NULL ;
  }
  
  if (Data != NULL) {
    delete[] Data ;
    Data = NULL ;
  }
  
  iWidth =_width ;
  iHeight = _height ;
  iSize = iWidth * iHeight ;

  /* ALLOCATION MEMOIRE POUR LES DONNEES */
  Data = new short [iSize] ;
  MatData = new short* [iHeight] ;
  short * ligne = Data ;
  for (int i = 0; i < iHeight ; i++, ligne+=iWidth) {
    MatData[i]= ligne ;
  }

  /* OUVERTURE DU FICHIER */
  FILE* f_in = fopen(sName.c_str(), "rb") ;
  if ( f_in == NULL ) {
    cerr<<"Erreur a l'ouverture du fichier "<<sName<<endl ;
    return false ;
  }

  /* LECTURE DES DONNEES */
  size_t nb = fread(Data, sizeof(short), iSize, f_in) ;
  if ( nb != (unsigned int)iSize) {
    cerr<<"Erreur a la lecture des donnees\n Taille = "<<nb<<endl ;
    return false ;
  }

  /* FERMETURE DU FICHIER */
  fclose(f_in);
  
  iMax = Data[0] ;
  iMin = iMax ;
  for (int i=0; i<iSize; i++) {
    if ( iMin > Data[i] )
      iMin = Data[i];
    if ( iMax < Data[i] )
      iMax = Data[i];
  }
  return true ;
}